﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace FrbaCommerce.Listado_Estadistico
{
    public partial class ListadoEstadistico : Form
    {
        public ListadoEstadistico()
        {
            InitializeComponent();
            getVisibilidades();     
        }

        private void getVisibilidades()
        {
            DataSet data = new DataSet();
            ConexionSql conexion = new ConexionSql();
            try
            {
                String query = "SELECT descripcion from ASDF.Visibilidad";
                data = conexion.ejecutarConsulta(query);
                cbx_visibilidad.DataSource = data.Tables[0];

            }
            catch (Exception ex)
            {
                MessageBox.Show("Problema de conexión con la BD: " + ex.Message);
            }

        }

        private void cmbListado_SelectionChangeCommitted(object sender, EventArgs e) 
        {
            if (this.cmbListado.SelectedIndex == 0)
            {
                this.cbx_visibilidad.Enabled = true;
            }
            else 
            {
                this.cbx_visibilidad.Enabled = false;
            }
        }

        private void btnGenerar_Click(object sender, EventArgs e)
        {
            if (!validarDatos()) 
            {
                MessageBox.Show("Por favor verifique sus opciones seleccionadas.");
                return;
            }

            DataSet data = new DataSet();
            ConexionSql conexion = new ConexionSql();

            try
            {
                if (cmbListado.SelectedIndex != 0)
                {
                    data = conexion.ejecutarConsulta(armarQuery());
                    if (data.Tables[0].Rows.Count == 0)
                    {
                        MessageBox.Show("No hay datos para mostrar");
                        return;
                    }
                    dgvListado.DataSource = data.Tables[0];
                }
                else 
                {
                    mostrarOpcion1();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Problema de conexión con la BD: " + ex.Message);
            }

        }

        private String armarQuery()
        {
            String query = "";

            /*"Vendedores con mayor facturación"*/
            if (cmbListado.SelectedIndex == 1)
            {
                query = "SELECT TOP 5 u.username as 'Usuario' , SUM(f.total) AS 'Monto Facturado' FROM ASDF.Factura f, ASDF.Usuario u";
                query += " WHERE f.usuario = u.id";
                query += " AND DATEPART (YEAR, f.fecha)="+ this.txtAnio.Text;
                query += " AND DATEPART (MONTH, f.fecha)>=" + getMesNroTrimestre(1).ToString() + " AND DATEPART (MONTH, f.fecha) <=" + getMesNroTrimestre(3).ToString();
                query += " GROUP BY u.username ORDER BY [Monto Facturado] DESC;";
            }

            /*"Vendedores con mayor calificación recibidas en el periodo"*/
            else if (cmbListado.SelectedIndex == 2)
            {
                query = "SELECT TOP 5 u.username AS 'Usuario', u.reputacion 'Reputación', COUNT(c.cant_estrellas) AS 'Cant. de calificaciones recibidas'";
                query += " FROM ASDF.Bitacora_Calificacion c, ASDF.Publicacion p, ASDF.Usuario u WHERE p.usuario = u.id";
                query += " AND c.cod_publi = p.cod AND DATEPART (YEAR, c.fecha)=" + this.txtAnio.Text;
                query += " AND DATEPART (MONTH, c.fecha) >=" + this.getMesNroTrimestre(1).ToString() + " AND DATEPART (MONTH, c.fecha) <=" + this.getMesNroTrimestre(3);
                query += " GROUP BY u.username, u.reputacion ORDER BY reputacion DESC;";
            }

            /*"Clientes con mayor cantidad de calificaciones pendientes"*/
            else if (cmbListado.SelectedIndex == 3)
            {
                query = "SELECT TOP 5 u.id, u.username, [ASDF].[CANT_PUBLICACIONES_POR_CALIFICAR_EN_TRIMESTRE](u.id, ";
                query += this.txtAnio.Text +","+ this.getMesNroTrimestre(1).ToString() + ","+ this.getMesNroTrimestre(1).ToString() + ")";
                query += " AS 'Cant. Calificaciones pendientes'FROM ASDF.Usuario u WHERE u.tipo=1 ORDER BY 'Cant. Calificaciones pendientes' DESC";
            }

            return query;
        }

        private DataTable CopyColumns(DataSet source, String column0, String column1, String column2)
        {
            DataTable dest = new DataTable();
            dest.Columns.Add("Posición");
            dest.Columns.Add(column0, source.Tables[0].Columns[0].DataType);
            dest.Columns.Add(column1, source.Tables[1].Columns[0].DataType);
            dest.Columns.Add(column2, source.Tables[2].Columns[0].DataType);

            int limite = source.Tables[0].Rows.Count;

            for (int i=0; i<limite; i++)
            {
                DataRow destRow = dest.NewRow();
                destRow["Posición"] = (i+1).ToString();
                destRow[column0] = source.Tables[0].Rows[i][column0];
                destRow[column1] = source.Tables[1].Rows[i][column1];
                destRow[column2] = source.Tables[2].Rows[i][column2];
                dest.Rows.Add(destRow);
            }
            return dest;
         }       

        private void mostrarOpcion1() 
        {
            String query;
            DataTable tabla = new DataTable();
            DataSet data = new DataSet();
            ConexionSql conexion = new ConexionSql();

            if (this.cbx_visibilidad.Text.Length == 0) 
            {
                this.cbx_visibilidad.SelectedIndex = 0; 
            }

            if (this.cmbTrimestre.SelectedIndex == 0) /*1,2,3*/
            {
                try 
                {
                    data=conexion.ejecutarConsulta(this.queryOpcion1());
                    this.dgvListado.DataSource = CopyColumns(data, "Enero", "Febrero", "Marzo");
                    this.dgvListado.AutoResizeColumns();

                }
                catch (Exception ex)
                {
                    MessageBox.Show("Problema de conexión con la BD: " + ex.Message);
                }
            }

            else if (this.cmbTrimestre.SelectedIndex == 1) /*4,5,6*/
            {
                try
                {
                    data = conexion.ejecutarConsulta(this.queryOpcion1());
                    this.dgvListado.DataSource = CopyColumns(data, "Abril", "Mayo", "Junio");
                    this.dgvListado.AutoResizeColumns();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Problema de conexión con la BD: " + ex.Message);
                }
            }

            else if (this.cmbTrimestre.SelectedIndex == 2) /*7,8,9*/
            {
                try
                {
                    data = conexion.ejecutarConsulta(this.queryOpcion1());
                    this.dgvListado.DataSource = CopyColumns(data, "Julio", "Agosto", "Septiembre");
                    this.dgvListado.AutoResizeColumns();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Problema de conexión con la BD: " + ex.Message);
                }
            }

            else /*10,11,12*/
            {
                try
                {
                    data = conexion.ejecutarConsulta(this.queryOpcion1());
                    this.dgvListado.DataSource = CopyColumns(data, "Octubre", "Noviembre", "Diciembre");
                    this.dgvListado.AutoResizeColumns();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Problema de conexión con la BD: " + ex.Message);
                }
            }
        }

        private void lnkLimpiar_Click(object sender, EventArgs e) 
        {
                txtAnio.Text = "";
                cmbTrimestre.SelectedIndex = 1;
                cmbListado.SelectedIndex = 1;
        }

        private String getCodigoVisibilidad() 
        {
            Visibilidad visibilidad = new Visibilidad();
            return visibilidad.BuscarIdPorDescripcion(this.cbx_visibilidad.Text).ToString();
        }

        private Boolean validarDatos() 
        {
            return (txtAnio.Text.Length > 0 && cmbTrimestre.Text.Length > 0 && cmbListado.Text.Length > 0);
        }

        private String queryOpcion1() 
        {
            String query = "";

            for (int i = 0; i <= 2; i++) 
            {
                query += "SELECT username AS '" + getMesNombreTrimestre(i) + "' FROM [ASDF].[TOP5_SIN_VENTAS_POR_MES_ANIO_VISIBILIDAD] (" + this.getMesNroTrimestre(i).ToString() + "," + this.txtAnio.Text + "," + getCodigoVisibilidad() + " ); ";
            }
            return query;
        }

        private int getMesNroTrimestre(int orden) 
        {

            if (this.cmbTrimestre.SelectedIndex == 0) 
            { /*1,2,3*/
                return (orden);
            }

            else if (this.cmbTrimestre.SelectedIndex == 1)
            { /*4,5,6*/
                return (orden + 3);
            }

            else if (this.cmbTrimestre.SelectedIndex == 2)
            { /*7,8,9*/
                return (orden + 6);
            }

            else 
            { /*10,11,12*/
                return (orden + 9);
            }
        }

        private String getMesNombreTrimestre(int orden) 
        {
            int mes = getMesNroTrimestre(orden);
            switch (mes) 
            {
                case 1: return "Enero";
                case 2: return "Febrero";
                case 3: return "Marzo";
                case 4: return "Abril";
                case 5: return "Mayo";
                case 6: return "Junio";
                case 7: return "Julio";
                case 8: return "Agosto";
                case 9: return "Septiembre";
                case 10: return "Octubre";
                case 11: return "Noviembre";
                case 12: return "Diciembre";
                default: return "";
            }
        }

    }
}
